#!/usr/bin/env python
import serial
import time

def main():
  simple_test()


def simple_test():
  dongle = Dongle()
  try:
    dongle.connect()
    print "Connected. Writing to foo... Hit ^C to stop."
    dongle.write_everything_to_file_from_now_on(open('foo', 'wb'))
  except KeyboardInterrupt:
    dongle.disconnect()

def print_buffer(buf, num_bytes):
  print "buffer:",
  for i in range(num_bytes):
    print "%02x" % buf[i],
  print

class Dongle:
  
  cmd_auto_connect = bytearray([0xc2])
  cmd_disconnect = bytearray([0xc1])
  start_of_connected_status_packet = [ 0xaa, 0xaa, 0x04, 0xd0 ]

  def __init__(self):
    self.buffer = []
    self.is_connected = False
    self.index_into_connection_packet = 0
    self.open()

  def open(self):
    baudrate = 115200
    port = '/dev/ttyUSB0'
    timeout = 0.1
    self.ser = serial.Serial(port=port, baudrate=baudrate, timeout=timeout)

  def read(self):
    buffer = bytearray(256)
    num_bytes_read = self.ser.readinto(buffer)
    print_buffer(buffer, num_bytes_read)
    # parse it, and set flags
    for i in range(num_bytes_read):
      b = buffer[i]
      if b == Dongle.start_of_connected_status_packet[self.index_into_connection_packet]:
        self.index_into_connection_packet += 1
        if self.index_into_connection_packet >= len(Dongle.start_of_connected_status_packet):
          self.is_connected = True
          self.index_into_connection_packet = 0
      else:
        self.index_into_connection_packet = 0

  def write(self, byte):
    self.ser.write(byte)

  def connect(self):
    toggle = True
    while True:
      self.read()
      if self.is_connected:
        return
      if toggle:
        self.write(Dongle.cmd_disconnect)
      else:
        self.write(Dongle.cmd_auto_connect)
      toggle = not toggle
      time.sleep(2)

  def write_everything_to_file_from_now_on(self, f):
    while True:
      f.write(self.ser.read())

  def disconnect(self):
    self.write(Dongle.cmd_disconnect)
    self.is_connected = False

if __name__ == '__main__':
  main()
